package com.bblocks.common.anti_reptile.module;

import com.bblocks.common.anti_reptile.constant.RuleTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDate;

/**
 * <p>Project: bb-anti-reptile - RuleVOStat</p>
 * <p>描述：url访问频率（综合结算得来）</p>
 *
 * @Author Zhao [125043150@qq.com]
 * @Date 2024/3/25 10:53
 * @Version 1.0
 * @since 8
 */
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class RuleStatVO implements Serializable {

    /**
     * id
     */
    private Long id;

    /**
     * 数据日
     */
    private LocalDate day;

    /**
     * 规则规则地址
     */
    private String url;

    /**
     * 用户平均qps
     */
    private Double rateAvgUser;

    /**
     * 用户最大qps
     */
    private Double rateMaxUser;

    /**
     * ip平均qps/用户
     */
    private Double rateAvgIp;

    /**
     * ip最大qps/用户
     */
    private Double rateMaxIp;


    /**
     * 平台平均qps
     */
    private Double rateAvgPlate;

    /**
     * 平台最大qps
     */
    private Double rateMaxPlate;



    //RATELIMIT
    /**
     * DB指定限流类型(ip)：1=限流 2=验证码 3=拉黑，优先级最高好，否则根据默认属性决定
     * 见 {@link com.bblocks.common.anti_reptile.constant.RuleResultEnum}
     */
    private Integer rateIpLimitType;

    /**
     *DB指定限流类型(user)：1=限流 2=验证码 3=拉黑，优先级最高好，否则根据默认属性决定
     * 见 {@link com.bblocks.common.anti_reptile.constant.RuleResultEnum}
     */
    private Integer rateUserLimitType;

    /**
     * DB指定限流类型(平台-一般平台限流类型为告警、限流)：1=限流 2=验证码 3=拉黑，优先级最高好，否则根据默认属性决定
     * 见 {@link com.bblocks.common.anti_reptile.constant.RuleResultEnum}
     */
    private Integer ratePlateLimitType;


    /**
     * 类型获取类型限流方式
     * @param ruleTypeEnum
     * @return
     */
    public  Integer limitTypeByRuleType(RuleTypeEnum ruleTypeEnum) {
        if(ruleTypeEnum == RuleTypeEnum.USER){
            return rateUserLimitType;
        }else if(ruleTypeEnum == RuleTypeEnum.IP){
            return rateIpLimitType;
        }else if(ruleTypeEnum == RuleTypeEnum.WHOLE_FLOW){
            return ratePlateLimitType;
        }else
            return null;
    }
}
